fix window resize on DPI changes
authorJyrki Gadinger <nilsding@nilsding.org>
Thu, 9 Jan 2025 10:44:56 +0000 (11:44 +0100)
committerJyrki Gadinger <nilsding@nilsding.org>
Wed, 15 Jan 2025 12:11:53 +0000 (13:11 +0100)
This commit fixes #7678 and likely fixes #7447 too.  On Windows, when
the screen is changed to one with a different scaling setting the window
is being incorrectly resized.  This can be worked around by storing the
window's size before moving it to a different screen, and then resizing
the window again.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
src/gui/systray.cpp

index 8074a4b7977b78f2c913ee717f32f759e1273ae1..3c28aca043d0955152a4665734e8065e0114cd47 100644 (file)
@@ -588,11 +588,18 @@ void Systray::setSyncIsPaused(const bool syncIsPaused)
 
 void Systray::positionWindowAtTray(QQuickWindow *window) const
 {
-    if (!useNormalWindow()) {
-        window->setScreen(currentScreen());
-        const auto position = computeWindowPosition(window->width(), window->height());
-        window->setPosition(position);
+    if (useNormalWindow()) {
+        return;
     }
+
+    // need to store the current window size before moving the window to another screen,
+    // otherwise it is being incorrectly resized by the OS or Qt when switching to a screen
+    // with a different DPI setting
+    const auto initialSize = window->size();
+    const auto position = computeWindowPosition(initialSize.width(), initialSize.height());
+    window->setPosition(position);
+    window->setScreen(currentScreen());
+    window->resize(initialSize);
 }
 
 void Systray::positionWindowAtScreenCenter(QQuickWindow *window) const